/**
 * 导出服务
 * 支持将查询结果导出为CSV和JSON格式
 */

/**
 * 导出查询结果为CSV格式
 * @param {Array} data 查询结果数据
 * @param {Array} columns 列定义
 * @param {string} fileName 文件名（默认：query_result.csv）
 */
export function exportAsCSV(data, columns, fileName = 'query_result.csv') {
  if (!data || !columns || data.length === 0) {
    throw new Error('无效的导出数据')
  }
  
  try {
    // 提取列名
    const headers = columns.map(col => col.name)
    
    // 创建CSV内容
    const csvContent = [
      // 表头行
      headers.join(','),
      
      // 数据行
      ...data.map(row => {
        return headers.map(header => {
          const value = row[header]
          
          // 处理不同数据类型
          if (value === null || value === undefined) {
            return ''
          } else if (typeof value === 'string') {
            // 字符串需要引号包裹，并转义引号
            return `"${value.replace(/"/g, '""')}"`
          } else {
            return String(value)
          }
        }).join(',')
      })
    ].join('\n')
    
    // 创建Blob对象
    const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8' })
    
    // 下载文件
    downloadFile(blob, fileName)
    
    return true
  } catch (error) {
    console.error('导出CSV失败:', error)
    throw error
  }
}

/**
 * 导出查询结果为Excel格式（实际为CSV，Excel可以打开）
 * @param {Array} data 查询结果数据
 * @param {Array} columns 列定义
 * @param {string} fileName 文件名（默认：query_result.xlsx）
 */
export function exportAsExcel(data, columns, fileName = 'query_result.xlsx') {
  if (!data || !columns || data.length === 0) {
    throw new Error('无效的导出数据')
  }
  
  try {
    // 提取列名
    const headers = columns.map(col => col.name)
    
    // 创建CSV内容（Excel可以打开CSV文件）
    const csvContent = [
      // 表头行
      headers.join('\t'),  // 使用制表符分隔，Excel能更好地识别
      
      // 数据行
      ...data.map(row => {
        return headers.map(header => {
          const value = row[header]
          // 处理不同数据类型
          if (value === null || value === undefined) {
            return ''
          } else if (typeof value === 'string') {
            // 处理包含制表符或换行符的字符串
            if (value.includes('\t') || value.includes('\n')) {
              return `"${value.replace(/"/g, '""')}"`
            }
            return value
          } else {
            return String(value)
          }
        }).join('\t')
      })
    ].join('\n')
    
    // 创建Blob对象 - 使用Excel能识别的MIME类型
    const blob = new Blob([csvContent], { 
      type: 'application/vnd.ms-excel;charset=utf-8' 
    })
    
    // 下载文件
    downloadFile(blob, fileName)
    
    return true
  } catch (error) {
    console.error('导出Excel失败:', error)
    throw error
  }
}

/**
 * 导出查询结果为JSON格式
 * @param {Array} data 查询结果数据
 * @param {Array} columns 列定义
 * @param {string} fileName 文件名（默认：query_result.json）
 * @param {boolean} pretty 是否格式化JSON（默认：true）
 */
export function exportAsJSON(data, columns, fileName = 'query_result.json', pretty = true) {
  if (!data || data.length === 0) {
    throw new Error('无效的导出数据')
  }
  
  try {
    // 创建JSON内容
    const jsonContent = pretty 
      ? JSON.stringify(data, null, 2) 
      : JSON.stringify(data)
    
    // 创建Blob对象
    const blob = new Blob([jsonContent], { type: 'application/json;charset=utf-8' })
    
    // 下载文件
    downloadFile(blob, fileName)
    
    return true
  } catch (error) {
    console.error('导出JSON失败:', error)
    throw error
  }
}

/**
 * 下载文件
 * @param {Blob} blob Blob对象
 * @param {string} fileName 文件名
 */
function downloadFile(blob, fileName) {
  // 创建URL
  const url = URL.createObjectURL(blob)
  
  // 创建下载链接
  const link = document.createElement('a')
  link.href = url
  link.download = fileName
  link.style.display = 'none'
  
  // 添加到文档并触发下载
  document.body.appendChild(link)
  link.click()
  
  // 清理
  setTimeout(() => {
    document.body.removeChild(link)
    URL.revokeObjectURL(url)
  }, 100)
} 